三维空间点的直线方程拟合(最小二乘法)

本文要解决如下问题:给定一些三维空间点,要求用直线拟合这些点,求出直线方程。

一、直线方程的三种表示方法:

参考:空间直线的点向式方程 - 百度文库 (baidu.com)

           空间直线方程 - 百度文库 (baidu.com)

1.一般式:

它实际上表示,直线是两个平面的交线,因此可以由两个平面方程得到,即:

\left\{\begin{matrix} A_{1} X + B_{1} Y + C_{1} Z + D_{1} = 0\\ A_{2} X + B_{2} Y + C_{2} Z + D_{2} = 0 \end{matrix}\right.

2.点向式(标准方程):

\frac{x-x_{0}}{m} = \frac{y-y_{0}}{n}=\frac{z-z_{0}}{p}

(m, n, p) 为直线方程的方向向量;(x0, y0, z0) 为直线上的一个点。需要注意的是(x-x0, y-y0, z-z0)的方向和方向向量是平行的,也因此推导出了上面的方程。

3.参数方程:

\frac{x-x_{0}}{m} = \frac{y-y_{0}}{n}=\frac{z-z_{0}}{p} = t 

由此就可以得到:

\left\{\begin{matrix} x = x_{0} + mt \\y=y_{0} + nt \\ z = z_{0} +pt\end{matrix}\right.

二、利用最小二乘,由三维空间数据点拟合直线方程:

参考文献:《三维空间点中基于最小二乘法的分段直线拟合方法》 薛丽红,2015年7月,齐齐哈尔学报,第31卷第4期 

相应链接:https://www.doc88.com/p-8189740853644.html  

联立上面的方程,就可以得到:

公式中,划红线的2,是该篇文章的笔误,应该是n, n表示数据点的个数。

       由此我们就可以得到k1, b1, k2, b2。如果想要把它转换成空间直线标准方程,可以先任意取一个z0值,根据k1,b1,k2,b2 就可以求出x0, y0, 然后任意取一个p值,根据k1, k2, 就可以求出m, n值,代入到标准方程即可(所以,标准方程不是唯一的,需要从标准方程的定义去理解为什么不是唯一的)。

三、python 代码实现:

##  由空间3维点拟合出一条直线
def linear_fitting_3D_points(points):
    '''
    用直线拟合三维空间数据点。
    
    参考https://www.doc88.com/p-8189740853644.html  
    《三维空间点中基于最小二乘法的分段直线拟合方法》 薛丽红,2015年7月,齐齐哈尔学报,第31卷第4期
    注意; 文中的公式推导有误,k1,b1,k2,b2中的系数2, 应该为n,n表示数据点的个数。
    
    直线方程可以转化成如下形式(具体见上面的文献):
    x = k1 * z + b1
    y = k2 * z + b2
    
    Input:
        points    ---   List, 三维空间数据点,例如:
                        [[2,3,48],[4,5,50],[5,7,51]]
                    
    返回值是公式系数 k1, b1, k2, b2
    '''

    #表示矩阵中的值
    Sum_X=0.0
    Sum_Y=0.0
    Sum_Z=0.0
    Sum_XZ=0.0
    Sum_YZ=0.0
    Sum_Z2=0.0

    for i in range(0,len(points)):
        xi=points[i][0]
        yi=points[i][1]
        zi=points[i][2]

        Sum_X = Sum_X + xi
        Sum_Y = Sum_Y + yi
        Sum_Z = Sum_Z + zi
        Sum_XZ = Sum_XZ + xi*zi
        Sum_YZ = Sum_YZ + yi*zi
        Sum_Z2 = Sum_Z2 + zi**2

    n = len(points) # 点数
    den = n*Sum_Z2 - Sum_Z * Sum_Z # 公式分母
    k1 = (n*Sum_XZ - Sum_X * Sum_Z)/ den
    b1 = (Sum_X - k1 * Sum_Z)/n
    k2 = (n*Sum_YZ - Sum_Y * Sum_Z)/ den
    b2 = (Sum_Y - k2 * Sum_Z)/n
    
    return k1, b1, k2, b2

如有错误,请指正。谢谢!

 

 

  • 26
    点赞
  • 152
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: CSDN最小二乘法拟合直线是一种通过云数据来拟合线性函数的方法。在云处理过程中,最常见的就是拟合平面和直线,这种方法被称为最小二乘法最小二乘法是一种通过对拟合方程进行约束来找到最佳拟合值的方法。对于一个包含n个数据集,最小二乘法希望找到一个拟合方程y=f(x)使得所有的数据到这个方程上的垂直距离之和最小。 通过计算最小二乘法的残差来确定最佳拟合值,即拟合直线的斜率和截距。残差是指每个数据拟合直线的垂直距离,可以看作是实际观测值与拟合值之间的差值。 在使用CSDN最小二乘法拟合直线时,需要先确定要拟合的数据范围和精度,然后通过计算云中各的坐标值来进行拟合。最后,可以得到一个拟合直线的斜率和截距,对于其他新的云数据,就可以使用这个方程来进行预测和拟合。 总之,使用CSDN最小二乘法拟合直线可以更精确地处理云数据,从而提升云处理的效率和准确性。 ### 回答2: CSDN最小二乘法拟合直线是一种计算机视觉和计算机图形学中的基本算法。它是用于在云数据中拟合直线的一种统计学方法,通常用于三维空间中的云数据拟合最小二乘法是一种最小化误差平方和的方法,用于拟合多项式、曲线和各种函数。 在实际应用中,CSDN最小二乘法拟合直线通常需要先从云数据中提取出符合要求的集。这些可以是一些特定形状的或符合某个局部范围条件的。然后,最小二乘法就会在这些的坐标中寻找最佳的拟合直线。在寻找最佳拟合直线的过程中,最小二乘法不断将直线的距离平方求和并尝试将该距离最小化。 总的来说,CSDN最小二乘法拟合直线的核心思想是通过最小化分析集到拟合直线的误差平方和,找到最佳解,从而得出一个接近真实数据的符合要求的直线。但需要注意的是,CSDN最小二乘法拟合直线的结果不一定是唯一的,因为集中可能存在多个最优解,因此在实际应用中需要进一步对数据进行分析和筛选,以确保最终结果的精确性和可靠性。 ### 回答3: CSND最小二乘法拟合直线是计算机科学领域中的一种算法,它可以通过一组云数据来计算出最符合这些直线方程。该算法是基于最小二乘法的原理,通过将数据的误差平方和最小化,来确定对应的最优拟合直线。 在进行最小二乘法拟合直线之前,首先需要将云数据导入计算机中,并进行云数据的处理。这些数据可以是通过激光或者其他传感技术获取到的三维云数据,也可以是通过计算机生成的虚拟云数据。 一般来说,进行最小二乘法拟合直线,需要三个步骤: 首先,需要对云数据进行处理。这包括对数据进行清洗、滤波、降噪等操作,以便更好地提取本质信息。 其次,需要对处理后的云数据进行求解。这个过程中,采用最小二乘法对数据进行拟合,寻找最优的拟合直线方程。 最后,需要进行评估和展示。这个过程中,可以对拟合结果进行评估和分析,以确保算法的准确性和可行性,并将结果以可视化形式展示出来。 通过上述步骤,就可以利用CSND最小二乘法拟合直线算法,对云数据进行处理和分析。这个算法广泛应用于计算机视觉、机器人技术等领域,帮助人们更好地理解和处理复杂的三维数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值